

import taichi as ti
ti.init(arch=ti.cuda)

#------1

#template 是模板根据传参进行自动判断 这样子传参数是传引用的
#但是必须传的太极内置类型
@ti.kernel
def copy(src:ti.template(),dst:ti.templete(),size):
    for i in range(size):
        dst[i] =src[i]


a = ti.field(ti.f32,4)
b = ti.field(ti.f32,4)
c = ti.field(ti.f32,12)
d = ti.field(ti.f32,12)


copy(a,b,4)
copy(c,d,12)

#------2
#太极目前禁止对template传入的参数进行修改 全局field除外
@ti.kernel
def change(x:ti.template()):
    vec2 = x
    vec2[0] = 3.0
    print(vec2)
    return vec2

vec=ti.Vector([2.0,1.0])
change(vec)

#------3
#原有一般传参方式中kernel或func内的变量变化不对外部影响
#但可以使用template传参方式来将function内的动作影响到外部
@ti.func
def myFunc(x:ti.template()):
    x+=1

@ti.kernel
def myKernel():
    x=24
    myFunc(x)
    print(x)    #25

myKernel()

#------4
#根据传参维度进行成组打包 
# 若y是0维 I则是None
# 若y是1维 I则是ti.Vector([i]) 
# 若y是2维 I则是ti.Vector([i,j]) 
# 若y是3维 I则是ti.Vector([i,j,k]) 
@ti.kernel
def copy(x:ti.template(),y:ti.template()):
    for I in ti.grouped(y):
        x[I]=y[I]




